﻿

//namespace Common.Algorithm.Core;
//internal class QuadTreeService<T>
//{

//    /// <summary>
//    /// 节点内物体最大数量
//    /// </summary>
//    public int capacity { get; set; } = 2;
//    /// <summary>
//    /// 最大层数
//    /// </summary>
//    public static int maxDepth { get; set; } = 12;


//    public TreeNode rootNode { get; set; }
//    public List<TreeNode> nodes { get; set; } = new List<TreeNode>();

//    public Dictionary<Guid, T> allItems { get; set; }


//    /// <summary>
//    /// 获得T的外包
//    /// </summary>
//    public static Func<T, Rectangle> getBBoxFunc { get; set; }

//    public QuadTreeService(Rectangle _envelop, List<T> _items)
//    {
//        this.allItems = _items.ToDictionary(k => Guid.NewGuid(), k => k);

//        rootNode = new TreeNode(_envelop, 0);
//        nodes.Add(rootNode);

//        var curNode = rootNode;
//        var subNodes = new List<TreeNode>() { rootNode };
//        var nexNodes = new List<TreeNode>();
//        int curDepth = 0;
//        while (curDepth < maxDepth)
//        {
//            foreach (var subNode in subNodes)
//            {
//                bool isFull = _items.Where(t => subNode.envelop.IsIntersect(getBBoxFunc(t))).Count() > capacity;
//                if (isFull)
//                {
//                    subNode.items.Clear();
//                    nexNodes = SpliteNode(subNode.envelop, curDepth + 1).ToList();
//                    nodes.AddRange(nexNodes);
//                    subNode.childs = nexNodes.Select(t => t.guid).ToArray(); 
//                }
//                else
//                {
//                    subNode.items.AddRange(allItems.Keys);
//                } 
//            }
//            subNodes = nexNodes;

//            curDepth++;
//        }

//    }

//    private IList<TreeNode> SpliteNode(Rectangle envelop, int depth)
//    {
//        List<TreeNode> treeNodes = new List<TreeNode>();
//        treeNodes[0] = new TreeNode(new Rectangle(envelop.midPnt, envelop.rigtTopPnt), depth);
//        treeNodes[1] = new TreeNode(new Rectangle(envelop.leftMidPnt, envelop.midTopPnt), depth);
//        treeNodes[2] = new TreeNode(new Rectangle(envelop.leftBtmPnt, envelop.midPnt), depth);
//        treeNodes[3] = new TreeNode(new Rectangle(envelop.midBtmPnt, envelop.rigtMidPnt), depth);
//        return treeNodes;
//    }


//    public class TreeNode
//    {
//        public TreeNode(Rectangle _rect, int _depth)
//        {
//            envelop = _rect;
//            curDepth = _depth;
//        }

//        public Guid guid { get; set; } = Guid.NewGuid();

//        public Rectangle envelop { get; set; }

//        /// <summary>
//        /// 当前层数
//        /// </summary>
//        public int curDepth { get; set; }

//        /// <summary>
//        /// 当前节点的内容物
//        /// </summary>
//        public List<Guid> items { get; set; } = new List<Guid>();

//        /// <summary>
//        /// 子节点
//        /// </summary>
//        public Guid[]? childs { get; set; }

//    }

//}
